Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Trait (programmation)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Trait_(programmation)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Trait_programmation rootpage-Trait_programmation skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Trait (programmation)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>Un <b>trait</b> est une <a href="Classe_(informatique)" title="Classe (informatique)">sous-classe</a> <a href="Classe_abstraite" title="Classe abstraite">abstraite</a>, un modèle conceptuel pour structurer des <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">programmes orientés objets</a>.
</p><p>C'est un ensemble de <a href="M%C3%A9thode_(informatique)" title="Méthode (informatique)">méthodes</a> concrètes ou fonctions, pouvant être ajouté à une classe pour étendre ses fonctionnalités.
</p><p>Quand un <a href="Langage_de_programmation" title="Langage de programmation">langage de programmation</a> supporte les <b>traits</b>, il permet la résolution explicite des conflits qui apparaissent quand une classe utilise deux traits qui ont des méthodes qui portent le même nom (contrairement aux <a href="Mixin" title="Mixin">mixins</a><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>).
</p><p>Les traits ne sont pas des <a href="Type_abstrait" title="Type abstrait">types abstraits</a> car ils ne capturent pas l'essence de l'objet mais celle de ses propriétés et méthodes<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>.
</p>

<div class="mw-heading mw-heading2"><h2 id="Implémentations"><span id="Impl.C3.A9mentations"></span>Implémentations</h2></div>
<ul><li>Les traits proviennent du langage <a href="Self_(langage)" title="Self (langage)">Self</a> <span class="need_ref" title="Self date de 1986." style="cursor:help;">en 1982</span><sup class="need_ref_tag" style="padding-left:2px;">[à&nbsp;vérifier]</sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="Java_(langage)" title="Java (langage)">Java</a> inclut cette fonctionnalité depuis sa version 8 sortie en mars 2014 introduisant la fonctionnalité des méthodes <a href="Valeur_par_d%C3%A9faut" title="Valeur par défaut">par défaut</a>.</li>
<li><a href="Scala_(langage)" title="Scala (langage)">Scala</a> inclut cette fonctionnalité<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="PHP" title="PHP">PHP</a> les propose depuis sa version 5.4<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="Rust_(langage)" title="Rust (langage)">Rust</a> propose cette fonctionnalité et l'utilise dans l'implémentation de sa bibliothèque standard<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="C%2B%2B" title="C++">C++</a>: les propose dans la <a href="Standard_Template_Library" title="Standard Template Library">STL</a> et <a href="Boost_C%2B%2B_Libraries" class="mw-redirect" title="Boost C++ Libraries">Boost</a></li>
<li>Les traits sont proposés pour inclusion dans <a href="Smalltalk" title="Smalltalk">Smalltalk</a>.</li>
<li>Les traits sont proposés pour inclusion dans <a href="Fortran" title="Fortran">Fortran</a> 202Y<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>, qui succédera à la norme Fortran 202X attendue en 2023.</li></ul>
<p>Par ailleurs, les «&nbsp;mixins de module&nbsp;» de <a href="Ruby" title="Ruby">Ruby</a> sont comparables aux traits dans une certaine mesure. De même, le <i>rôle</i> en <a href="Perl_6" class="mw-redirect" title="Perl 6">Perl 6</a> est une fonctionnalité inspirée du concept de trait.
</p>
<div class="mw-heading mw-heading2"><h2 id="Exemple">Exemple</h2></div>
<p>L'exemple d'utilisation suivant en <a href="PHP" title="PHP">PHP</a> montre une meilleure granularité des traits en comparaison d'un <a href="H%C3%A9ritage_multiple" title="Héritage multiple">héritage multiple</a>&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="k">trait</span> <span class="nx">Hello</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">sayHello</span><span class="p">()</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s1">'Hello '</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">trait</span> <span class="nx">World</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">sayWorld</span><span class="p">()</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s1">' World'</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">class</span> <span class="nc">MyHelloWorld</span> <span class="p">{</span>
<span class="k">use</span> <span class="nx">Hello</span><span class="p">,</span> <span class="nx">World</span><span class="p">;</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">sayExclamationMark</span><span class="p">()</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s1">'!'</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nv">$o</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyHelloWorld</span><span class="p">();</span>
<span class="nv">$o</span><span class="o">-&gt;</span><span class="na">sayHello</span><span class="p">();</span>
<span class="nv">$o</span><span class="o">-&gt;</span><span class="na">sayWorld</span><span class="p">();</span>
<span class="nv">$o</span><span class="o">-&gt;</span><span class="na">sayExclamationMark</span><span class="p">();</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="references-small decimal" style=""><div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Guerraoui2003"><span class="ouvrage" id="Rachid_Guerraoui2003"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Rachid <span class="nom_auteur">Guerraoui</span>, <cite class="italique" lang="en">ECOOP '99&nbsp;: Object-Oriented Programming&nbsp;: 13th European Conference Lisbon, Portugal, June 14-18, 1999 Proceedings</cite>, Springer, <time class="nowrap" datetime="2003-07-31" data-sort-value="2003-07-31">31 juillet 2003</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="https://books.google.fr/books?id=q8lsCQAAQBAJ&amp;pg=PA45&amp;dq=%22suppose+the+mixin+and+the+class+to+which+it+is+applied+both+define+a+method+with+the+same+name%22%22">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=ECOOP+%2799+%3A+Object-Oriented+Programming+%3A+13th+European+Conference+Lisbon%2C+Portugal%2C+June+14-18%2C+1999+Proceedings&amp;rft.pub=Springer&amp;rft.aulast=Guerraoui&amp;rft.aufirst=Rachid&amp;rft.date=2003-07-31&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ATrait+%28programmation%29"></span></span></span></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text"><span class="ouvrage" id="S._Stone1986"><span class="ouvrage" id="Harold_S._Stone1986"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Harold <span class="nom_auteur">S. Stone</span>, <cite class="italique" lang="en">1986 proceedings</cite>, IEEE Computer Society Press, <abbr class="abbr" title="collection">coll.</abbr>&nbsp;«&nbsp;Association for Computing Machinery, IEEE Computer Society&nbsp;», <time>1986</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="https://books.google.fr/books?id=Yx2fO7vvXF4C&amp;dq=%22Abstract+data+type%22+trait">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=1986+proceedings&amp;rft.pub=IEEE+Computer+Society+Press&amp;rft.aulast=S.+Stone&amp;rft.aufirst=Harold&amp;rft.date=1986&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ATrait+%28programmation%29"></span></span></span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Gutmann2007"><span class="ouvrage" id="Peter_Gutmann2007"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Peter <span class="nom_auteur">Gutmann</span>, <cite class="italique" lang="en">Cryptographic Security Architecture&nbsp;: Design and Verification</cite>, Springer Science &amp; Business Media, <time class="nowrap" datetime="2007-05-08" data-sort-value="2007-05-08">8 mai 2007</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="https://books.google.fr/books?id=oWjjBwAAQBAJ&amp;pg=PA193&amp;dq=%22Specifications+are+presented+in+terms+of+traits+that+define+an+abstract+data+type+or+occasionally+just+a+set+of+operators+that+aren%27t+tied+to+any+particular+data+type%22">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Cryptographic+Security+Architecture&amp;rft.pub=Springer+Science+%26+Business+Media&amp;rft.stitle=Design+and+Verification&amp;rft.aulast=Gutmann&amp;rft.aufirst=Peter&amp;rft.date=2007-05-08&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ATrait+%28programmation%29"></span></span></span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><span class="ouvrage" id="1982"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> G. Curry, L. Baer, D. Lipkie, and B. Lee, <cite class="italique" lang="en">Traits&nbsp;: An approach to multiple-inheritance subclassing. In SIGOA conference on Office Information Systems, pages 1–9, Philadelphia, Pennsylvania, USA</cite>, <a href="Association_for_Computing_Machinery" title="Association for Computing Machinery">ACM Press</a>, <time>1982</time><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Traits+%3A+An+approach+to+multiple-inheritance+subclassing.+In+SIGOA+conference+on+Office+Information+Systems%2C+pages+1%E2%80%939%2C+Philadelphia%2C+Pennsylvania%2C+USA&amp;rft.pub=ACM+Press&amp;rft.date=1982&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ATrait+%28programmation%29"></span></span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://docs.scala-lang.org/tutorials/tour/traits.html"><cite style="font-style:normal;" lang="en">Traits</cite></a>&nbsp;»</span>&nbsp;: <span class="citation not_fr_quote" lang="en">«&nbsp;<span class="italique">traits are used to define object types by specifying the signature of the supported methods.</span>&nbsp;»</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://fr.php.net/manual/en/language.oop5.traits.php"><cite style="font-style:normal;" lang="en">Traits</cite></a>&nbsp;»</span>&nbsp;: <span class="citation not_fr_quote" lang="en">«&nbsp;<span class="italique">As of PHP 5.4.0, PHP implements a method of code reuse called Traits.</span>&nbsp;»</span></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://doc.rust-lang.org/book/traits.html"><cite style="font-style:normal;" lang="en">Traits</cite></a>&nbsp;»</span>&nbsp;: <span class="citation not_fr_quote" lang="en">«&nbsp;<span class="italique">A trait is a language feature that tells the Rust compiler about functionality a type must provide.</span>&nbsp;»</span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://github.com/j3-fortran/fortran_proposals"><cite style="font-style:normal;" lang="en">fortran_proposals/20-109.txt at master · j3-fortran/fortran_proposals</cite></a>&nbsp;», sur <span class="italique">GitHub</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2021-09-18" data-sort-value="2021-09-18">18 septembre 2021</time>)</small></span></span>
</li>
</ol></div>
</div>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="Interface_(programmation_orient%C3%A9e_objet)" title="Interface (programmation orientée objet)">Interface (programmation orientée objet)</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Liens_externes">Liens externes</h3></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.iam.unibe.ch/~scg/Research/Traits/">Traits - Composable Units of Behavior</a> sur <a rel="nofollow" class="external text" href="http://scg.unibe.ch">Software Composition Group</a> (<a href="Universit%C3%A9_de_Berne" title="Université de Berne">université de Berne</a>)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://wiki.php.net/rfc/traits">Proposition d'implémentation en PHP</a></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2024-01-05" href="https://fr.wikipedia.org/wiki/?title=Trait_(programmation)&amp;oldid=211202657">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>